﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace amk.ValidacaoModelo{

  [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
  public class ValidaCnpjCpf : System.ComponentModel.DataAnnotations.ValidationAttribute{

    public override bool IsValid(object value){
      if (value == null) return false;

      if (Documento == TipoDocumento.CNPJ)
          return this.ValidarCNPJ(value.ToString());
      else if (Documento == TipoDocumento.CPF)
          return this.ValidarCPF(value.ToString());
      return false;
    }

    public TipoDocumento Documento { get; set; }

    public bool ValidarCNPJ(string cnpj){
      int[] multiplicador1 = new int[12] { 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2 };
      int[] multiplicador2 = new int[13] { 6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2 };
      int soma;
      int resto;
      string digito;
      string tempCnpj;

      cnpj = cnpj.Trim();
      cnpj = cnpj.Replace(".", "").Replace("-", "").Replace("/", "");

      if (cnpj.Length != 14)
        return false;

      tempCnpj = cnpj.Substring(0, 12);

      soma = 0;
      for (int i = 0; i < 12; i++)
        soma += int.Parse(tempCnpj[i].ToString()) * multiplicador1[i];

      resto = (soma % 11);
      if (resto < 2)
        resto = 0;
      else
        resto = 11 - resto;

      digito = resto.ToString();

      tempCnpj = tempCnpj + digito;
      soma = 0;
      for (int i = 0; i < 13; i++)
        soma += int.Parse(tempCnpj[i].ToString()) * multiplicador2[i];

      resto = (soma % 11);
      if (resto < 2)
        resto = 0;
      else
        resto = 11 - resto;

      digito = digito + resto.ToString();

      return cnpj.EndsWith(digito);
    }

    public bool ValidarCPF(string cpf){
      int[] multiplicador1 = new int[9] { 10, 9, 8, 7, 6, 5, 4, 3, 2 };
      int[] multiplicador2 = new int[10] { 11, 10, 9, 8, 7, 6, 5, 4, 3, 2 };
      string tempCpf;
      string digito;
      int soma;
      int resto;

      cpf = cpf.Trim();
      cpf = cpf.Replace(".", "").Replace("-", "");

      if (cpf.Length != 11)
        return false;

      switch (cpf){
        case "11111111111":
          return false;
        case "00000000000":
          return false;
        case "22222222222":
          return false;
        case "33333333333":
          return false;
        case "44444444444":
          return false;
        case "55555555555":
          return false;
        case "66666666666":
          return false;
        case "77777777777":
          return false;
        case "88888888888":
            return false;
        case "99999999999":
          return false;
      }

      tempCpf = cpf.Substring(0, 9);
      soma = 0;
      for (int i = 0; i < 9; i++)
        soma += int.Parse(tempCpf[i].ToString()) * multiplicador1[i];

      resto = soma % 11;
      if (resto < 2)
        resto = 0;
      else
        resto = 11 - resto;

      digito = resto.ToString();

      tempCpf = tempCpf + digito;

      soma = 0;
      for (int i = 0; i < 10; i++)
        soma += int.Parse(tempCpf[i].ToString()) * multiplicador2[i];

      resto = soma % 11;
      if (resto < 2)
        resto = 0;
      else
        resto = 11 - resto;

      digito = digito + resto.ToString();

      return cpf.EndsWith(digito);
    }
  }

  public enum TipoDocumento{
    CPF,
    CNPJ
  }

}